package com.example.base_model.room

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.example.base_model.room.bean.Pet
import com.example.base_model.room.bean.User
import com.example.base_model.room.dao.UserDao
import com.example.base_model.room.type_converter.ProfileConverters
import com.example.base_model.room.type_converter.StringListConverter

/**
 * @Author jiangKunKun
 * @CreateDate 2025/7/29
 * @Description Room 数据库，用于管理应用程序的持久化数据。
 * @SpittingGrooves
 */
@Database(
    entities = [
        User::class, // 用户实体类
        Pet::class   // 宠物实体类
    ],
    version = 1, // 数据库版本号
    exportSchema = false // 不导出数据库模式文件
)
@TypeConverters(
    StringListConverter::class, // 字符串列表类型转换器
    ProfileConverters::class    // 个人资料相关类型转换器
)
abstract class AppDatabase : RoomDatabase() {

    /**
     * 提供 [UserDao] 的抽象方法，用于访问用户数据。
     * @return [UserDao] 实例。
     */
    abstract fun userDao(): UserDao

    companion object {
        // @Volatile 保证 INSTANCE 变量在所有线程中立即可见
        @Volatile
        private var INSTANCE: AppDatabase? = null

        /**
         * 获取 [AppDatabase] 的单例实例。
         * 使用双重检查锁定模式，确保线程安全且只创建一个实例。
         *
         * @param context 应用程序上下文。
         * @return [AppDatabase] 的单例实例。
         */
        fun getInstance(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) { // 双重检查锁定，保证线程安全
                val instance = Room.databaseBuilder(
                    context.applicationContext, // 使用 applicationContext 避免内存泄漏
                    AppDatabase::class.java,    // 数据库类
                    "app_database"              // 数据库文件名
                )
                    // .addMigrations(MIGRATION_1_2, MIGRATION_2_3) // 如果有数据库升级，在这里添加迁移策略
                    // 当数据库升级时，如果没有匹配的迁移策略，则销毁并重建数据库 (开发阶段常用)
                    .fallbackToDestructiveMigration()
                    .build()
                INSTANCE = instance
                instance
            }
        }
    }
}